perm filename ARRAY.MAN[VLI,LSP] blob sn#381933 filedate 1978-09-08 generic text, type T, neo UTF8











                                   CHAPITRE 6

                     LES TABLEAUX ET LA PILE UTILISATEUR



     Un nouveau type d'objet est apparu, le tableau .  Un tableau est  un
     ensemble de memoires contigues pouvant contenir n'importe quel objet
     lisp (atomes, nombres, chaines ou listes).  Les differents  elements
     d'un tableau sont numerotes a l'aide d'un indice.  Tous les tableaux
     sont  actuellement  uni-dimensionnes  par  souci  d'efficacite,   le
     premier indice est 0 (ces tableaux sont donc des vecteurs).
     Les differents tableaux sont stockes dans une zone speciale;   cette
     zone  est  partagee avec la pile utilisateur.  Les fonctions sur les
     tableaux  permettent  de  definir  un  tableau,  d'avoir  acces  aux
     elements  d'un  tableau,  de  modifier  un  element  d'un tableau ou
     d'appliquer une fonction aux differents elements d'un tableau.



     6.1  DEFINITION ET ACCES AUX TABLEAUX

     (DA <nom> <taille> <fonction>) [SUBR a 3 arguments]

          permet de definir un  nouveau  tableau.   <nom>  est  un  atome
          litteral qui devient le nom du tableau;  <taille> est le nombre
          d'elements que peut contenir le tableau.  S'il n'y a pas  assez
          de  place  pour  stocker  ce nouveau tableau, l'erreur suivante
          apparait :
             ** no room for arrays.
          Si  la  fonction  (d'initialisation)  n'est  pas  fournie   (si
          <fonction>=NIL),  tous les elements du tableau sont initialises
          a NIL;  dans le cas contraire, la fonction est  appliquee  pour
          chaque element avec l'indice de cet element lie au 1er argument
          (s'il existe) de la fonction.  Il peut donc y  avoir  un  appel
          implicite  de  la  fonction  MAPARRAY.  Les differentes valeurs
          ramenees par cette fonction seront les valeurs d'initialisation
          des  elements  du  tableau.   DA  ramene  le  nom du tableau en
          valeur.

          ex : (DA 'TAB 100)      ; definition d'un tableau de nom TAB de
                                    100 elements. Chaque element est 
                                    initialise a NIL ;
     VLISP 10 . 3    Manuel de Reference                         Page 6-2


               (DA 'TBL 10 '(LAMBDA (X) 0)) ; definition d'un tableau de 
                                              10 elements, chaque element
                                              est initialise a 0 ;

               (DA 'ARR 10           ; definition d'un tableau de 10
                  '(LAMBDA (X) (- 9 X)))    elements initialises a :
                                            9 8 7 6 5 4 3 2 1 0 ;

     Une fois le tableau defini, on a acces  a  chacun  des  elements  du
     tableau  en  evaluant une forme a 1 argument dont la fonction est le
     nom du tableau et l'argument l'indice de l'element desire.   Le  nom
     du   tableau  devient  donc  une  fonction  d'acces  a  ce  tableau.
     L'argument de cette fonction d'acces est evalue.

     L'interprete ne teste la validite  de  l'indice  fourni  que  si  le
     bit 7 du R.G.  est positionne (ce qui est l'option par defaut).

     il est facile de  definir  de  nouvelles  fonctions  d'acces  a  des
     tableaux  deja  definis  ce  permet  de tester la validite du ou des
     indices (voir les derniers exemples).

          ex : (TAB 5)  ->  NIL
               (TBL (ADD1 4))  -> 0



     6.2  LES FONCTIONS STANDARD SUR LES TABLEAUX

     Pour toutes les fonctions sur les tableaux qui vont  etre  decrites,
     les  erreurs  (le nom fourni n'est pas un nom de tableau ou l'indice
     est incorrect) sont signalees par le message :
        ** array error : <nom du tableau> <indice>


     (DIM <nom>) [SUBR a 1 argument]

          l'argument <nom> doit etre un nom de tableau.   DIM  ramene  le
          plus grand indice de ce tableau.

          ex : (DA 'TAB 50)  -> TAB
               (DIM 'TAB)    -> 49


     (SETA <nom> <indice> <valeur>) [SUBR a 3 arguments]

          met dans l'element du tableau specifie par le nom et  l'indice,
          la valeur fournie en troisieme argument.  SETA ramene en valeur
          la valeur chargee.

          ex : (SETA 'TAB 5 10)  ->  10
               (TAB 5)  ->  10
     VLISP 10 . 3    Manuel de Reference                         Page 6-3


     (SETQA <nom> <indice> <valeur>) [FSUBR]

          est identique a la fonction SETA mais le nom du  tableau  n'est
          pas evalue, en revanche l'indice <indice> et la valeur <valeur>
          le sont toujours.

          ex : (SETQA TAB 6 (ADD1 19))  -> 20
               (TAB 20)  ->  20


     (MAPARRAY <nom> <fonction>) [SUBR a 2 arguments]

          permet  d'appliquer  la  fonction  specifiee  pour  chacun  des
          elements  du tableau dont le nom est donne.  Le 1er argument de
          la fonction est lie (s'il existe) a l'indice  de  l'element  du
          tableau.  MAPARRAY ramene NIL en valeur.

          ex : (MAPARRAY 'TAB '(LAMBDA (X) (SETA 'TAB X (ADD1 X))))  
                ->  NIL


     (MAPARRAYQ <nom> <fonction>) [FSUBR]

          est identique a la fonction MAPARRAY mais  le  nom  du  tableau
          n'est  pas  evalue,  en  revanche  le  nom de la fonction l'est
          toujours.


     (FILLARRAY <nom> <liste>) [SUBR a 2 arguments]

          range dans les differents elements du tableau, dont le nom  est
          specifie  comme  1er  argument,  les  elements successifs de la
          liste 2eme argument.  Si la liste est trop courte, le reste  du
          tableau  est  rempli avec des NILs ;  si la liste 2eme argument
          est en realite un atome, le tableau est rempli avec cet  atome.
          FILLARRAY ramene le nom du tableau en valeur.

          ex : (DA 'TAB 10)  ->  TAB
               (FILLARRAY 'TAB '(0 1 2 3 4 5 6))  ->  TAB
               (FILLARAY 'TAB '99)  ->  TAB


     (LISTARRAY <nom>) [SUBR a 1 argument]

          ramene la liste constituee de tous les elements du tableau dont
          le nom est fourni en 1er argument.

          ex : (DA 'TAB 5)   -> TAB
               (FILLARRAY 'TAB '(10 11 12))  -> TAB
               (LISTARRAY 'TAB)  -> (10 11 12 NIL NIL)
     VLISP 10 . 3    Manuel de Reference                         Page 6-4


     6.3  EXEMPLES D'UTILISATION DES TABLEAUX


     ? (DA 'TAB 100)         ; definition d'un tableau de nom TAB  ;
     = TAB                   ; possedant 100 elements, chacun des  ;
                             ; elements est initialise a NIL.      ;
     ? (DIM 'TAB)
     = 99

     ? (DE TAB1 (I)          ; definition d'une nouvelle fonction  ;
     ?   (IF (LE 0 I 99)     ; d'acces a TAB1 qui teste la validite ;
     ?       (TAB I)         ; de l'indice fourni ;
     ?       (ERROR ["debordement TAB1 " I])))
     = TAB

     ? (DE TAB2 (I J)         ; definition d'une nouvelle fonction ;
     ?   (IF (AND (LE 0 I 9)  ; permettant d'acceder au tableau    ;
     ?            (LE 0 J 9))  ; TAB au moyen de 2 indices pouvant ;
     ?       (TAB (PLUS (TIMES I 10) J))  ; varier de 0 a 9. Cette ;
     ?       (ERROR ["debordement TAB2 " I J])))  ; fonction teste ;
                                             ; les indices fournis ;
     = TAB2

     ? (SETQA TAB 20 3)
     = 3

     ? (TAB1 20)
     = 3

     ? (TAB2 2 0)
     = 3

     ? (DA 'CLAIR 10 '(LAMBDA (X)
     ?      ((ADD1 X) '("zero" "un" "deux" "trois" "quatre"
     ?                  "cinq" "six" "sept" "huit" "neuf"))))
     = CLAIR

     ? (CLAIR 1)
     = "un"

     ? (CLAIR 2)
     = "deux"

     ? (MAPARRAYQ CLAIR (LAMBDA (X)
     ?     (SETQA CLAIR X (CONCAT "-" (CLAIR X) "-"))))
     = NIL

     ? (CLAIR 9)
     = "-neuf-"
     VLISP 10 . 3    Manuel de Reference                         Page 6-5


     6.4  LA PILE UTILISATEUR

     Il existe une zone menmoire dans laquelle il est possible de  sauver
     temporairement  des  objets  lisp quelconques.  Cette zone est geree
     comme une pile;  c'est la pile utilisateur (qui  n'a  aucun  rapport
     avec  la pile utilisee par l'interprete).  La zone dans laquelle est
     stockee cette pile utilisateur etant partagee avec les tableaux,  sa
     taille  est  donc determinee par la difference entre la taille de la
     zone allouee aux tableaux et  la  somme  des  tailles  de  tous  les
     tableaux  definis.   En  cas  de  debordement  de  pile  les erreurs
     suivantes apparaissent :
        ** user stack overflow.
        ** user stack underflow.
     Apres ces erreurs (comme apres toute autre erreur)  le  pointeur  de
     pile utilisateur est reinitialise.


     (PUSH <s1> ...  <sN>) [SUBR a N arguments]

          empile les valeurs des differentes expressions <s1>  ...   <sN>
          et  ramene  <sN>  en valeur.  Toutefois si aucun argument n'est
          fourni (i.e.  si on evalue (PUSH)), une valeur  NIL  est  quand
          meme empilee.


     (POP <n>) [SUBR a 1 argument]

          si l'argument <n> n'est pas  fourni,  le  sommet  de  pile  est
          ramene  en  valeur  et  le pointeur de pile est mis a jour.  Si
          l'argument numerique <n>  est  donne,  POP  ramene  le  <n>ieme
          element  contenu dans la pile a partir du pointeur de pile mais
          celui-ci n'est pas modifie.  Si ce nombre est negatif, on  peut
          avoir acces a des elements de la pile precedemment empiles puis
          depiles.  Il ne faut toutefois pas sortir de  la  zone  allouee
          pour   la   pile  sous  peine  de  declencher  les  erreurs  de
          debordement de pile.


     (PSTACK <n>) [SUBR a 1 argument]

          si l'argument <n> n'est pas fourni, ramene le pointeur de  pile
          courant.  Si l'argument numerique <n> est fourni, il devient la
          nouvelle valeur du pointeur de pile.  Cette fonction sert  donc
          tout naturellement a manipuler le pointeur de pile lui-meme.

          Exemples d'utilisation de la pile utilisateur

          ex : (PUSH 'A 3)        -> 3
               (PUSH)             -> NIL
               (PUSH 'B)          -> B
               (POP 0)               -> B
               (POP 1)               -> NIL
     VLISP 10 . 3    Manuel de Reference                         Page 6-6


               (POP 2)               -> 3
               (POP)              -> B
               (POP)              -> NIL
               (POP 1)               -> A
               (POP -2)              -> B
               (POP)              -> 3
               (POP)              -> A

               (PUSH 1 2)             ->  2
               (SETQ PPILE (PSTACK))  ->  33456   (par exemple)
               (PUSH 3 4 5 6 7 8)     ->  8
               (PSTACK PPILE)         ->  33456
               (POP)                  ->  2
               (POP)                  ->  1
               (POP)
            ** user stack underflow.
                ... etc ...
                                                             Page Index-1


                            TABLE D'INDEX DU CHAPITRE 6




          (DA nom taille fonction)   SUBR a 3 arguments  6-1
          (DIM nom)   SUBR a 1 argument . 6-2
          (FILLARRAY nom liste)   SUBR a 2 arguments  6-3
          (LISTARRAY nom)   SUBR a 1 argument  6-3
          (MAPARRAY nom fonction)   SUBR a 2 arguments  6-3
          (MAPARRAYQ nom fonction)   FSUBR  6-3
          (POP n)  SUBR a 1 argument  . . 6-5
          (PSTACK n)   SUBR a 1 argument  6-5
          (PUSH s1 ... sn)   SUBR a n arguments  6-5
          (SETA nom indice valeur)   SUBR a 3 arguments  6-2
          (SETQA nom indice valeur)   FSUBR  6-3

          ** array error : <nom du tableau> <indice>  6-2
          ** no room for arrays.  . . . . 6-1
          ** user stack overflow. . . . . 6-5
          ** user stack underflow.  . . . 6-5

          Bit 7 du r.g. . . . . . . . . . 6-2

          Pile utilisateur  . . . . . . . 6-5

          Tableau . . . . . . . . . . . . 6-1